/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package sys.dao;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import sys.bean.CidadeBean;
import sys.bean.ClienteBean;
import sys.bean.FormaPgtoBean;
import sys.bean.ProdutoPedidoBean;
import sys.bean.PedidoBean;
import sys.bean.ProdutoBean;
import sys.bean.UsuarioBean;
import sys.utils.ConexaoADS;
import sys.utils.ConexaoMySql;
import sys.utils.Utils;
import static sys.utils.Utils.dataCorreta;

/**
 *
 * @author Cesar Daniel
 */
public class ProdutoPedidoDao {

    /*
     Listando produtos dos clientes que ainda não agendamento
     */
    public List<ProdutoPedidoBean> ProdutosCliente(int idCliente) throws SQLException {
        List<ProdutoPedidoBean> produtosCliente = new ArrayList<>();

        Connection con = ConexaoMySql.getConection();

        String sql = "SELECT pp.id_pedido, p.codigo, p.descricao, pp.qtd_compra, pp.qtd_entregue, pr.qtd_enviado, \n"
                + "pp.custo_unt, pp.valor_unt,  r.id_romaneio \n"
                + "FROM produto_pedido pp \n"
                + "LEFT OUTER JOIN produto p ON (p.codigo = pp.produto_codigo) \n"
                + "LEFT OUTER JOIN pedido ped ON (ped.id_pedido = pp.id_pedido) \n"
                + "LEFT OUTER JOIN cliente c ON (c.id_cliente = ped.id_cliente) \n"
                + "LEFT OUTER JOIN romaneio r ON (r.id_pedido = ped.id_pedido) \n"
                + "LEFT OUTER JOIN produto_romaneio pr ON (pr.id_romaneio = r.id_romaneio) \n"
                + "WHERE c.id_cliente = " + idCliente + " \n"
                + "AND pp.qtd_compra > pp.qtd_entregue \n"
                + "GROUP BY 1";

        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {

            ProdutoPedidoBean produtoPedido = new ProdutoPedidoBean();
            PedidoBean pedido = new PedidoBean();
            ProdutoBean produto = new ProdutoBean();

            produto.setCodigo(Utils.codCorreto(rs.getString("codigo"), 5));
            produto.setDescricao(rs.getString("descricao"));

            produtoPedido.setProduto(produto);

            pedido.setPedido(rs.getString("id_pedido"));

            produtoPedido.setPedido(pedido);

            produtoPedido.setQtdProdutoCompra(rs.getDouble("qtd_compra"));

            produtoPedido.setQtdEnviado(rs.getDouble("qtd_enviado"));

            produtoPedido.setQtdEntregue(rs.getDouble("qtd_entregue"));
            produtoPedido.setpCusto(rs.getDouble("custo_unt"));
            produtoPedido.setPvenda(rs.getDouble("valor_unt"));

            produtosCliente.add(produtoPedido);
        }

        stmt.close();
        con.close();

        return produtosCliente;
    }

    /*
     Listando produtos dos clientes que ainda não agendamento
     */
    public List<ProdutoPedidoBean> ProdutosCliente(int idCliente, int idPedido) throws SQLException {
        List<ProdutoPedidoBean> produtosCliente = new ArrayList<>();

        Connection con = ConexaoMySql.getConection();

        String sql = "SELECT pp.id_pedido, p.codigo, p.descricao, pp.qtd_compra, pp.qtd_entregue, pr.qtd_enviado, \n"
                + "pp.custo_unt, pp.valor_unt,  r.id_romaneio \n"
                + "FROM produto_pedido pp \n"
                + "LEFT OUTER JOIN produto p ON (p.codigo = pp.produto_codigo) \n"
                + "LEFT OUTER JOIN pedido ped ON (ped.id_pedido = pp.id_pedido) \n"
                + "LEFT OUTER JOIN cliente c ON (c.id_cliente = ped.id_cliente) \n"
                + "LEFT OUTER JOIN romaneio r ON (r.id_pedido = ped.id_pedido) \n"
                + "LEFT OUTER JOIN produto_romaneio pr ON (pr.id_romaneio = r.id_romaneio) \n"
                + "WHERE c.id_cliente = " + idCliente + " \n"
                + "AND pp.id_pedido = " + idPedido + "\n"
                + "AND pp.qtd_compra > pp.qtd_entregue \n"
                + "GROUP BY 1";

        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {

            ProdutoPedidoBean produtoPedido = new ProdutoPedidoBean();
            PedidoBean pedido = new PedidoBean();
            ProdutoBean produto = new ProdutoBean();

            produto.setCodigo(Utils.codCorreto(rs.getString("codigo"), 5));
            produto.setDescricao(rs.getString("descricao"));

            produtoPedido.setProduto(produto);

            pedido.setPedido(rs.getString("id_pedido"));

            produtoPedido.setPedido(pedido);

            produtoPedido.setQtdProdutoCompra(rs.getDouble("qtd_compra"));

            produtoPedido.setQtdEnviado(rs.getDouble("qtd_enviado"));

            produtoPedido.setQtdEntregue(rs.getDouble("qtd_entregue"));
            produtoPedido.setpCusto(rs.getDouble("custo_unt"));
            produtoPedido.setPvenda(rs.getDouble("valor_unt"));

            produtosCliente.add(produtoPedido);
        }

        stmt.close();
        con.close();

        return produtosCliente;
    }

    public List<ProdutoPedidoBean> listaPedidosEntrega(String dataInicial, String dataFinal, String idProduto, String idCliente) throws SQLException {
        List<ProdutoPedidoBean> pedidosEntrega = new ArrayList<>();

        Connection con = ConexaoMySql.getConection();

//        String sql = "SELECT c.id_cliente, c.nome, c.endereco, c.n_endereco, c.bairro, UPPER(cid.nome) AS cidade, c.fone \n"
//                + "FROM produto_pedido pp \n"
//                + "INNER JOIN produto pro ON (pro.codigo = pp.produto_codigo) \n"
//                + "INNER JOIN pedido p ON (p.id_pedido = pp.id_pedido) \n"
//                + "INNER JOIN cliente c ON (c.id_cliente = p.id_cliente) \n"
//                + "INNER JOIN cidade cid ON (cid.id = c.cidade_id) \n"
//                + "WHERE \n"
//                + "pp.qtd_entregue < pp.qtd_compra \n"
//                + "AND p.flag_saldo_cliente = 'S' \n"
//                + "AND c.id_cliente LIKE '%" + idCliente + "%' \n"
//                + "AND pro.codigo LIKE '%" + idProduto + "%' \n"
//                + "AND p.`data` BETWEEN '" + dataInicial + "' AND '" + dataFinal + "' \n"
//                + "GROUP BY 1 \n"
//                + "ORDER BY p.`data`";
        String sql = "SELECT c.id_cliente, c.nome, c.endereco, c.n_endereco, c.bairro, UPPER(cid.nome) AS cidade, c.fone \n"
                + "FROM produto_pedido pp \n"
                + "INNER JOIN produto pro ON (pro.codigo = pp.produto_codigo) \n"
                + "INNER JOIN pedido p ON (p.id_pedido = pp.id_pedido) \n"
                + "INNER JOIN cliente c ON (c.id_cliente = p.id_cliente) \n"
                + "INNER JOIN cidade cid ON (cid.id = c.cidade_id) \n"
                + "WHERE \n"
                + "pp.qtd_entregue < pp.qtd_compra \n"
                + "AND c.id_cliente LIKE '%" + idCliente + "%' \n"
                + "AND pro.codigo LIKE '%" + idProduto + "%' \n"
                + "AND p.`data` BETWEEN '" + dataInicial + "' AND '" + dataFinal + "' \n"
                + "GROUP BY 1 \n"
                + "ORDER BY p.`data`";

        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {

            ProdutoPedidoBean iPedido = new ProdutoPedidoBean();
            PedidoBean pedido = new PedidoBean();
            ClienteBean cliente = new ClienteBean();
            CidadeBean cidade = new CidadeBean();

            cidade.setNome(rs.getString("cidade"));

            cliente.setCidade(cidade);
            cliente.setCodigo(rs.getString("id_cliente"));
            cliente.setNome(rs.getString("nome"));
            cliente.setEndereco(rs.getString("endereco"));
            cliente.setnEndereco(rs.getString("n_endereco"));
            cliente.setBairro(rs.getString("bairro"));
            cliente.setFone(rs.getString("fone"));

            pedido.setCliente(cliente);

            iPedido.setPedido(pedido);

            pedidosEntrega.add(iPedido);
        }

        stmt.close();
        con.close();

        return pedidosEntrega;
    }

    public void insertItensPedidoMySql(String nPedido) throws SQLException, IOException {

        List<ProdutoPedidoBean> itensPedido = itensPedidoConcreteira(nPedido);

        Connection con = ConexaoMySql.getConection();

        PreparedStatement stmt = null;

        for (ProdutoPedidoBean iPedido : itensPedido) {
            String sql = "INSERT INTO produto_pedido \n"
                    + "(id_pedido, produto_codigo, qtd_compra, valor_unt, custo_unt) \n"
                    + "VALUES \n"
                    + "(?, ?, ?, ?, ?);";

            stmt = con.prepareStatement(sql);

            stmt.setInt(1, Integer.parseInt(nPedido));
            stmt.setInt(2, Integer.parseInt(iPedido.getProduto().getCodigo()));
            stmt.setDouble(3, iPedido.getQtdProdutoCompra());
            stmt.setDouble(4, iPedido.getPvenda());
            stmt.setDouble(5, iPedido.getProduto().getpCusto());

            stmt.execute();
        }

        stmt.close();
        con.close();
    }

    /*
     ITENS DOS PEDIDOS DA CONCRETEIRA
     */
    public static List<ProdutoPedidoBean> itensPedidoConcreteira(String nPedido) throws SQLException, IOException {
        List<ProdutoPedidoBean> itensPedido = new ArrayList<>();

        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C14NPED, C14PROD, C01DESC, C14QTD, C14VRUNIT, C01PRCCUS \n"
                + "FROM SPAC14 \n"
                + "INNER JOIN SPAC01 ON (C01CODIGO = C14PROD)\n"
                + "WHERE C14NPED = '" + nPedido + "' \n"
                + "AND C14TIPO = 'P'";

        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {

            ProdutoPedidoBean iPedido = new ProdutoPedidoBean();

            ProdutoBean produto = new ProdutoBean();

            produto.setCodigo(rs.getString("C14PROD"));
            produto.setDescricao(rs.getString("C01DESC"));
            produto.setpCusto(rs.getDouble("C01PRCCUS"));
            iPedido.setProduto(produto);

            iPedido.setQtdProdutoCompra(rs.getDouble("C14QTD"));
            iPedido.setPvenda(rs.getDouble("C14VRUNIT"));

            PedidoBean pedido = new PedidoBean();
            pedido.setPedido(rs.getString("C14NPED"));

            iPedido.setPedido(pedido);

            itensPedido.add(iPedido);

        }

        stmt.close();
        con.close();

        return itensPedido;
    }


    /*
     lista com produtos comprados pelo cliente no período
     */
    public static List<ProdutoPedidoBean> produtosClientePeriodo(String dtInicial, String dtFinal, String codCliente, String contulta) throws SQLException, IOException {
        List<ProdutoPedidoBean> produtosCliente = new ArrayList<>();

        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C13NPED, C13DATA, C04NOME, C05NOME, C01CODBAR, C01DESC, C10DESC, C14QTD, C14VRUNIT, C01FLAG \n"
                + "FROM SPAC14, SPAC13, SPAC04, SPAC01, SPAC10, SPAC05 \n"
                + "WHERE \n"
                + "C13NPED = C14NPED \n"
                + "AND C13VEND = C04CODIGO \n"
                + "AND C13FPAGTO = C10CODIGO \n"
                + "AND C01CODIGO = C14PROD "
                + "AND C05CODIGO = C13CLIE\n"
                + "AND C13TIPO = 'P' \n"
                + "AND C13SITU = '' \n"
                + "AND C13CLIE LIKE '%" + codCliente + "%' \n"
                + "AND C13DATA BETWEEN '" + dtInicial + "' AND '" + dtFinal + "'"
                + contulta;

        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {

            ProdutoPedidoBean iPedido = new ProdutoPedidoBean();

            iPedido.setQtdProdutoCompra(rs.getDouble("C14QTD"));
            iPedido.setPvenda(rs.getDouble("C14VRUNIT"));

            PedidoBean pedido = new PedidoBean();

            pedido.setPedido(rs.getString("C13NPED"));
            pedido.setData(dataCorreta(rs.getString("C13DATA")));

            UsuarioBean usuario = new UsuarioBean();
            usuario.setNome(rs.getString("C04NOME"));
            pedido.setUsuario(usuario);

            ProdutoBean produto = new ProdutoBean();
            produto.setCodigoBarras(rs.getString("C01CODBAR"));
            produto.setDescricao(rs.getString("C01DESC"));

            if (rs.getString("C01FLAG").equals("A")) {
                produto.setSituacao("ATIVO");
            } else {
                produto.setSituacao("INATIVO");
            }
            ClienteBean cliente = new ClienteBean();
            cliente.setNome(rs.getString("C05NOME"));
            pedido.setCliente(cliente);

            pedido.setProduto(produto);
            iPedido.setPedido(pedido);

            FormaPgtoBean fPgto = new FormaPgtoBean();
            fPgto.setDescricao(rs.getString("C10DESC"));
            pedido.setfPgto(fPgto);

            iPedido.setPedido(pedido);

            produtosCliente.add(iPedido);
        }
        stmt.close();
        con.close();
        return produtosCliente;
    }

}
